home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / boot / BlizKick.lha / BlizKick / Modules / AlertFix.ASM < prev    next >
Assembly Source File  |  2000-09-04  |  6KB  |  273 lines

  1. ; FILE: Source:modules/AlertFix.ASM          REV: 5 --- cool Alert fix for 040/060
  2.  
  3. ;
  4. ; AlertFix patch for BlizKick ("patch" Module)
  5. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  6. ;
  7. ; This patch fixes the problems with pending alerts & 680x0.library
  8. ; being resident in blizzppc flash. Probably only useful with
  9. ; Blizzard PPC boards.
  10. ;
  11. ; V1.1 - 2nd Feb 2000
  12. ; Fixed major bug from the code, it broke regular Alert() calls. Huh.
  13. ;
  14. ; V1.2 - 5th Feb 2000
  15. ; Made it possible to plant AlertFix inside ROM.
  16. ;
  17. ;
  18. ; Written by Harry "Piru" Sintonen.
  19. ; This source code is Public Domain.
  20.  
  21.     include    "blizkickmodule.i"    ; Some required...
  22.  
  23.     SECTION    PATCH,CODE
  24. _DUMMY_LABEL
  25.     BK_PTC
  26.  
  27. ; Code is run with following incoming parameters:
  28. ;
  29. ; a0=ptr to ROM start (buffer)    eg. $1DE087B8
  30. ; a1=ptr to ROM start (ROM)    eg. $00F80000 (do *not* access!)
  31. ; d0=ROM lenght in bytes    eg. $00080000
  32. ; a2=ptr to _FindResident routine (will search ROM buffer for resident tag):
  33. ;    CALL: jsr (a2)
  34. ;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to resident name
  35. ;     OUT: d0=ptr to resident (buf) or NULL
  36. ; a3=ptr to _InstallModule routine (can be used to plant a "module"):
  37. ;    CALL: jsr (a3)
  38. ;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to module, d6=dosbase
  39. ;     OUT: d0=success
  40. ; a4=ptr to _Printf routine (will dump some silly things (errormsg?) to stdout ;-)
  41. ;    CALL: jsr (a4)
  42. ;      IN: a0=FmtString, a1=Array (may be 0), d6=dosbase
  43. ;     OUT: -
  44. ; d6=dosbase, a6=execbase
  45. ;
  46. ; Code should return:
  47. ;
  48. ; d0=true if succeeded, false if failed.
  49. ; d1-d7/a0-a6 can be trashed. a7 *must* be preserved! ;-)
  50.  
  51.     moveq    #0,d7
  52.  
  53.     cmp.w    #37,($C,a0)        ;requires V37+ rom image
  54.     blo    .exit
  55.  
  56.     lea    (regs,pc),a5
  57.     movem.l    d0/a0-a4,(a5)
  58.  
  59.     lea    (.resname,pc),a1
  60.     movem.l    (regs,pc),d0/a0
  61.     move.l    (findresident,pc),a2
  62.     jsr    (a2)
  63.     lea    (.nores,pc),a1
  64.     tst.l    d0
  65.     beq    .err
  66.  
  67.     move.l    d0,a4
  68.     move.l    (RT_INIT,a4),a2
  69.     move.l    a2,d2
  70.     ;test if inside rom bounds?
  71.     move.l    (rom_log,pc),d0
  72.     cmp.l    d0,a2
  73.     blo.b    .nofix
  74.     add.l    (rom_size,pc),d0
  75.     cmp.l    d0,a2
  76.     bhs.b    .nofix
  77.     ; inside rom, so generate ram buffer address
  78.     sub.l    (rom_log,pc),a2        -$f80000
  79.     add.l    (rom_phys,pc),a2    +buffer
  80. .nofix
  81.     lea    (.badres,pc),a1
  82.     cmp.l    #$42B80000,(a2)
  83.     bne    .err
  84.     cmp.w    #$48E7,(4,a2)
  85.     bne    .err
  86.     cmp.w    #$242E,(8,a2)
  87.  
  88.     move.w    #1024/2,d0
  89. .find    subq.w    #1,d0
  90.     beq    .err
  91.     addq.l    #2,a2
  92.     cmp.l    #$42B80000,(a2)
  93.     bne.b    .find
  94.     cmp.w    #$70FF,(4,a2)
  95.     bne.b    .find
  96.     move.l    a2,d3
  97.  
  98.     lea    (.badrom,pc),a1
  99.     move.l    (rom_phys,pc),a2
  100.     move.w    #32768/2,d0
  101. .find2    subq.w    #1,d0
  102.     beq    .err
  103.     addq.l    #2,a2
  104.     cmp.l    #$203C<<16|'HE',(a2)
  105.     bne.b    .find2
  106.     cmp.l    #'LP'<<16|$B0B8,(4,a2)
  107.     bne.b    .find2
  108.     cmp.l    #$21C00000,(12,a2)
  109.     bne.b    .find2
  110.     cmp.l    #$41F80100,(16,a2)
  111.     bne.b    .find2
  112.  
  113.     ; finally ready for patching
  114.  
  115.     ; install the patch code
  116.  
  117.     movem.l    (regs,pc),d0/a0
  118.     lea    (_AlertFix_module,pc),a1
  119.     move.l    (installmodule,pc),a3
  120.     jsr    (a3)
  121.  
  122.     ; find ourselve
  123.  
  124.     movem.l    (regs,pc),d0/a0
  125.     lea    (_name,pc),a1
  126.     move.l    (findresident,pc),a3
  127.     jsr    (a3)
  128.  
  129.     lea    (.plantfail,pc),a1
  130.     tst.l    d0
  131.     beq.b    .err
  132.  
  133.     move.l    d0,a5
  134.     ; (RT_INIT,a5) gives us pointer to RT_INIT as logical address,
  135.     ; a5 + RT_SIZE is pointer to data after RT structure (usually
  136.                 ; RT_INIT pos) in physical memory.
  137.     move.l    (RT_INIT,a5),a3
  138.     lea    (RT_SIZE,a5),a5
  139.  
  140.     ;lea    (_ahook1-_init,a3),a1
  141.     addq.l    #4,d2
  142.     ;move.l    a1,(RT_INIT,a4)
  143.     move.l    a3,(RT_INIT,a4)
  144.     move.l    d2,(_backfromh1-_init,a5)
  145.  
  146.     lea    (_ahook2-_init,a3),a1
  147.     move.l    d3,a0
  148.     move.w    #$4EB9,(a0)+
  149.     move.l    a1,(a0)+
  150.  
  151.     lea    (_alert1-_init,a3),a1
  152.     move.w    #$4EB9,(a2)+
  153.     move.l    a1,(a2)+
  154.  
  155.     lea    (_alert2-_init,a3),a1
  156.     addq.l    #6,a2
  157.     move.w    #$4EB9,(a2)+
  158.     move.l    a1,(a2)+
  159.  
  160.     moveq    #1,d7
  161.  
  162. .err    tst.l    d7
  163.     bne.b    .exit
  164.     lea    (.errh,pc),a0
  165.     move.l    a1,-(sp)
  166.     move.l    sp,a1
  167.     move.l    (printf,pc),a2
  168.     jsr    (a2)
  169.     addq.l    #4,sp
  170. .exit    move.l    d7,d0
  171.     rts
  172.  
  173.  
  174. .resname    dc.b    'alert.hook',13,10,0
  175.  
  176. .errh    dc.b    'AlertFix: couldn''t %s!',10,0
  177.  
  178. .nores    dc.b    'find alert.hook',0
  179. .badres    dc.b    'patch alert.hook',0
  180. .badrom    dc.b    'patch Alert()',0
  181. .plantfail    dc.b    'InstallModule(), add some EXTRESBUF',0
  182.  
  183.     CNOP    0,2
  184. _AlertFix_module
  185.  BK_MOD BKMF_SingleMode,_end,(0)<<24+37<<16+NT_UNKNOWN<<8+(256-54),_name,_idstr,_init
  186.  
  187. ; Singlemode on,
  188. ; never init this module, requires KS V37.x or better, module type NT_UNKNOWN, priority -54.
  189.  
  190. _init    ; this code will never be called directly!
  191. _ahook1    moveq    #0,d0
  192.     sub.l    a0,a0
  193.     bsr.b    _write
  194.     jmp    $badc0de
  195. _backfromh1    EQU    *-4
  196.  
  197. _ahook2    moveq    #0,d0
  198.     sub.l    a0,a0
  199.     bsr.b    _write
  200.     moveq    #-1,d0
  201.     rts
  202.  
  203. _alert1    addq.l    #4,(sp)
  204.     sub.l    a0,a0
  205.     bsr.b    _read
  206.     cmp.l    #'HELP',d0
  207.     rts
  208.  
  209. _alert2    addq.l    #6,(sp)
  210.     sub.l    a0,a0
  211.     move.l    #'HELP',d0
  212.     bsr.b    _write
  213.  
  214.     lea    ($100).w,a0
  215.     move.l    d7,d0
  216.     bsr.b    _write
  217.     move.l    a5,d0
  218.     ;bra.b    _write
  219.  
  220. ;  IN: a0.l=address
  221. ;      d0.l=data
  222. _write    movem.l    d1-d2/a5/a6,-(sp)
  223.     move.l    (4).w,a6
  224.     lea    (.write_s,pc),a5
  225.     jsr    (-$1E,a6)
  226.     movem.l    (sp)+,d1-d2/a5/a6
  227.     move.l    d0,(a0)+        also write mmu dest
  228.     rts
  229. .write_s    movec    dfc,d2            store old dfc
  230.     moveq    #0,d1            destination function code=0
  231.     movec    d1,dfc
  232.     moves.l    d0,(a0)            write bypassing MMU!
  233.     movec    d2,dfc            restore old dfc
  234.     nop                sync pipelines
  235.     rte
  236.  
  237. ;  IN: a0.l=address
  238. ; OUT: d0.l=data
  239. _read    movem.l    d1/a5/a6,-(sp)
  240.     move.l    (4).w,a6
  241.     lea    (.read_s,pc),a5
  242.     jsr    (-$1E,a6)
  243.     movem.l    (sp)+,d1/a5/a6
  244.     rts
  245. .read_s    movec    sfc,d1            store old sfc
  246.     moveq    #0,d0            source function code=0
  247.     movec    d0,sfc
  248.     moves.l    (a0)+,d0        read bypassing MMU!
  249.     movec    d1,sfc            restore old sfc
  250.     nop                sync pipelines
  251.     rte
  252.  
  253. _name
  254. _idstr    dc.b    'AlertFix.patchcode',0
  255.  
  256.     CNOP    0,2
  257. _end
  258.  
  259.  
  260.     CNOP    0,2
  261. regs
  262. rom_size    ds.l    1
  263. rom_phys    ds.l    1
  264. rom_log    ds.l    1
  265. findresident    ds.l    1
  266. installmodule    ds.l    1
  267. printf    ds.l    1
  268.  
  269.     SECTION    VERSION,DATA
  270.  
  271.     dc.b    '$VER: AlertFix_PATCH 1.2 (5.8.00)',0
  272.  
  273.